package com.jiang.专题.数组.Q135;

/**
 * @author Jiang
 * @version 1.0
 * @date 2025/01/15 23:24
 */
class Solution {
    // 两次循环
    // public int candy(int[] ratings) {
    //     int len = ratings.length;
    //     int[] count = new int[len];
    //     count[0] = 1;
    //     for(int i = 1; i < len; i++) {
    //         if (ratings[i] > ratings[i - 1] && count[i] <= count[i - 1]) {
    //             count[i] = count[i - 1] + 1;
    //         } else {
    //             count[i] = 1;
    //         }
    //     }

    //     for(int i = len - 2; i >= 0 ; i--) {
    //         if (ratings[i] > ratings[i + 1] && count[i] <= count[i + 1]) {
    //             count[i] = count[i + 1] + 1;
    //         }
    //     }

    //     int sum = 0;
    //     for(int i = 0; i < len; i++) {
    //         sum += count[i];
    //     }
    //     return sum;

    // }

    // 一次循环
    public int candy(int[] ratings) {
        // 递减序列的长度 dec，最近的递增序列的长度 inc 和前一个同学分得的糖果数量 pre
        int inc = 1, dec = 0, pre = 1;
        int len = ratings.length;
        int res = 1;
        for (int i = 1; i < len; i++) {
            if (ratings[i] >= ratings[i - 1]) {
                pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1; // 与前面一样为1， 大于为pre + 1
                inc = pre; // inc记录递增序列最高获得糖果数
                res += pre; // 记录总糖果数
                dec = 0; // 递减序列为0
            } else {
                dec++; // 比前面小，递减序列 + 1， 表示整个递减序列孩子获得的糖果数都加一
                if (inc == dec) { // 当当前的递减序列长度和上一个递增序列等长时，需要把最近的递增序列的最后一个同学也并进递减序列中，也就是递增序列最高获得糖果数 + 1
                    dec++;
                }
                pre = 1; // 递减序列最后一个孩子获得的糖果数一定是1
                res += dec; // 记录总糖果数， 加的是递减序列，因为整个递减序列孩子获得的糖果数都加一
            }
        }
        return res;
    }
}
